package com.example.mediademo.decode.interfaces;

import android.media.MediaFormat;

/**
 * 音视频解码器接口类
 * 为什么extends Runnable 因为我们定义的Decoder解码器进行同步解码是一个耗时操作,
 * 需要不断压入数据和拉取数据，所以需要把解码器放到线程池中执行
 */
public interface IDecoder extends Runnable {

    /**
     * 暂停解码
     */
    void pause();

    /**
     * 继续解码
     */
    void resume();

    /**
     * 停止解码
     */
    void stop();

    /**
     * 是否在解码
     * @return flag
     */
    boolean isDecoding();

    /**
     * 是否在快进
     * @return flag
     */
    boolean isSeeking();

    /**
     * 跳转到指定位置
     * 并返回实际帧的时间
     *
     * @param pos: 毫秒
     * @return 实际时间戳，单位：毫秒
     */
    long seekTo(long pos);

    /**
     * 跳转到指定位置,并播放
     * 并返回实际帧的时间
     *
     * @param pos: 毫秒
     * @return 实际时间戳，单位：毫秒
     */
    long seekAndPlay(long pos);

    /**
     * 是否停止解码
     * @return flag
     */
    boolean isStop();

    /**
     * 设置状态监听器
     * @param listener 解码状态监听器
     */
    void setStateListener(IDecodeStateListener listener);

    void setSizeListener(IDecoderProgress listener);

    /**
     * 获取宽度
     * @return 宽度值
     */
    int getWidth();

    /**
     * 获取高度值
     * @return 高度值
     */
    int getHeight();

    /**
     * 获取时长
     * @return 时长
     */
    long getDuration();

    /**
     * 获取视频角度
     * @return 角度值
     */
    int getRotationAngle();

    /**
     * 获取音视频对应的格式参数
     * @return MediaFormat 参数对象
     */
    MediaFormat getMediaFormat();

    /**
     * 获取音轨
     * @return 音轨 Track
     */
    int getTrack();

    /**
     * 获取解码的文件路径
     * @return 文件路径
     */
    String getFilePath();

    IDecoder withoutSync();

}
